import os
import datetime
import signal
import sys
import subprocess
import time

# 全局变量用于控制循环
running = True

# 设置录音文件存储目录
RECORDINGS_DIR = "recordings"

def signal_handler(sig, frame):
    """处理中断信号"""
    global running
    print("\n正在停止录音...")
    running = False

def ensure_recordings_dir():
    """确保录音目录存在"""
    if not os.path.exists(RECORDINGS_DIR):
        os.makedirs(RECORDINGS_DIR)
        print(f"创建录音目录: {RECORDINGS_DIR}")
    return RECORDINGS_DIR

def setup_audio_levels():
    """设置音频设备音量"""
    try:
        # 设置录音音量 (0-100%)
        print("正在设置录音音量...")
        
        # 方法1: 使用amixer设置麦克风音量
        subprocess.run(['amixer', 'sset', 'Mic', '90%'], capture_output=True)
        subprocess.run(['amixer', 'sset', 'Capture', '90%'], capture_output=True)
        
        # 方法2: 尝试设置USB Audio设备音量
        subprocess.run(['amixer', '-c', '1', 'sset', 'Mic', '90%'], capture_output=True)
        subprocess.run(['amixer', '-c', '1', 'sset', 'Capture', '90%'], capture_output=True)
        
        print("✅ 音量设置完成 (90%)")
        
    except Exception as e:
        print(f"⚠️ 音量设置警告: {e}")

def recs():
    """录音主函数"""
    global running
    
    # 确保录音目录存在
    recordings_dir = ensure_recordings_dir()
    
    # 设置音频音量
    setup_audio_levels()
    
    # 设置信号处理
    signal.signal(signal.SIGINT, signal_handler)  # Ctrl+C
    signal.signal(signal.SIGTERM, signal_handler)  # 终止信号
    
    i = 1
    print("开始增强音量录音，按 Ctrl+C 停止...")
    print(f"录音文件将保存在: {os.path.abspath(recordings_dir)}")
    
    while running:
        try:
            print(f'录音片段: {i}')
            tim = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
            filename = f'f{tim}.wav'
            filepath = os.path.join(recordings_dir, filename)
            
            # 增强版sox录音命令 - 添加音量增益和噪声抑制
            # gain: 增加6dB增益 (相当于音量翻倍)
            # compand: 动态范围压缩，提高小音量部分
            cmd = f'sox -t alsa plughw:1 {filepath} trim 0 00:00:60 gain 6 compand 0.3,1 6:-70,-60,-20 -5 -90 0.2'
            
            print(f"正在录制 (增强音量): {filename}")
            
            # 使用subprocess运行，可以更好地控制进程
            process = subprocess.Popen(cmd, shell=True, 
                                     stdout=subprocess.PIPE, 
                                     stderr=subprocess.PIPE)
            
            # 等待进程完成或检测到停止信号
            while process.poll() is None and running:
                time.sleep(0.1)  # 短暂睡眠以减少CPU使用
                
            # 如果用户要求停止，终止sox进程
            if not running and process.poll() is None:
                process.terminate()
                # 给进程一点时间正常退出
                time.sleep(0.5)
                # 如果仍然在运行，强制终止
                if process.poll() is None:
                    process.kill()
                print("录音已终止")
                break
            
            # 检查录音结果
            stdout, stderr = process.communicate()
            
            # 检查文件是否成功创建
            if os.path.exists(filepath):
                file_size = os.path.getsize(filepath)
                print(f"录音完成 (增强): {filename} ({file_size} bytes)")
                
                # 显示音频信息
                if file_size > 1000:  # 文件大小合理
                    print(f"✅ 音频增强: +6dB增益, 动态压缩")
                else:
                    print(f"⚠️ 文件较小，可能录音有问题")
            else:
                print(f"❌ 警告: 文件未创建: {filename}")
                if stderr:
                    print(f"错误信息: {stderr.decode()}")
                
            i += 1
            
        except KeyboardInterrupt:
            print("\n用户中断")
            running = False
        except Exception as e:
            print(f"发生错误: {e}")
            running = False
    
    print("增强录音程序已安全退出")

def test_audio_device():
    """测试音频设备"""
    print("🔍 测试音频设备...")
    try:
        # 检查录音设备
        result = subprocess.run(['arecord', '-l'], capture_output=True, text=True)
        print("可用录音设备:")
        print(result.stdout)
        
        # 检查混音器设置
        result = subprocess.run(['amixer', '-c', '1'], capture_output=True, text=True)
        if result.returncode == 0:
            print("当前音量设置:")
            for line in result.stdout.split('\n'):
                if 'Capture' in line or 'Mic' in line:
                    print(f"  {line}")
    except Exception as e:
        print(f"设备测试失败: {e}")

if __name__ == "__main__":
    if len(sys.argv) > 1 and sys.argv[1] == 'test':
        test_audio_device()
    else:
        recs()